Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>OpenMP</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/OpenMP"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-OpenMP rootpage-OpenMP skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">OpenMP</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><table class="float-right infobox toccolours toptextcells" style="border-spacing:5px; font-size:90%; text-align:left; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:105%; text-align:center;">OpenMP
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td colspan="2" class="notheme" style="text-align:center; background-color:#f8f9fa;"><span typeof="mw:File"></span>
</td></tr>
<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td><b><a href="Softwareentwickler" title="Softwareentwickler">Entwickler</a></b>
</td>
<td><a rel="nofollow" class="external text" href="https://www.openmp.org/resources/openmp-compilers-tools/">Liste kompatibler Compiler</a>
</td></tr>
<tr>
<td><b>Aktuelle&nbsp;<a href="Version_(Software)" title="Version (Software)">Version</a></b>
</td>
<td>6.0 <br> (November 2024)
</td></tr>
<tr>
<td><b>Aktuelle Vorabversion</b>
</td>
<td>-
</td></tr>
<tr>
<td><b><a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a></b>
</td>
<td><a href="Linux" title="Linux">Linux</a>, <a href="Unix" title="Unix">Unix</a>, <a href="Microsoft_Windows_NT" title="Microsoft Windows NT">Microsoft Windows NT</a>
</td></tr>
<tr>
<td><b><a href="Programmiersprache" title="Programmiersprache">Programmier­sprache</a></b>
</td>
<td><a href="C%2B%2B" title="C++">C++</a>, <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>, <a href="Fortran" title="Fortran">Fortran</a>
</td></tr>
<tr>
<td><b>Kategorie</b>
</td>
<td><a href="Programmierschnittstelle" title="Programmierschnittstelle">API</a>
</td></tr>
<tr>
<td><b>Lizenz</b>
</td>
<td>unbekannt (open)
</td></tr>
<tr>
<td><b><a href="Lokalisierung_(Softwareentwicklung)" title="Lokalisierung (Softwareentwicklung)">deutschsprachig</a></b>
</td>
<td>nein
</td></tr>
<tr>
<td class="hintergrundfarbe5" colspan="2" style="text-align:center;"><a rel="nofollow" class="external text" href="http://openmp.org/">openmp.org/</a>
</td></tr></tbody></table>
<p><b>OpenMP</b> ist eine seit 1997 gemeinschaftlich von mehreren <a href="Hardware" title="Hardware">Hardware</a>- und <a href="Compiler" title="Compiler">Compiler</a>herstellern entwickelte <a href="Programmierschnittstelle" title="Programmierschnittstelle">Programmierschnittstelle</a> (API) für die Shared-Memory-Programmierung in <a href="C%2B%2B" title="C++">C++</a>, <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> und <a href="Fortran" title="Fortran">Fortran</a> auf <a href="Multiprozessor" class="mw-redirect" title="Multiprozessor">Multiprozessor</a>-<a href="Computer" title="Computer">Computern</a>.
</p><p>OpenMP parallelisiert Programme auf der Ebene von Schleifen, die in <a href="Thread_(Informatik)" title="Thread (Informatik)">Threads</a> ausgeführt werden, und unterscheidet sich dadurch von anderen Ansätzen (z.&nbsp;B. <a href="Message_Passing_Interface" title="Message Passing Interface">MPI</a>), bei denen ganze Prozesse parallel laufen und durch Nachrichtenaustausch zusammenwirken.
</p><p>Der OpenMP-Standard definiert dazu spezielle Compiler-Direktiven, die diesen dann anweisen z.&nbsp;B. die Abarbeitung einer <a href="For-Schleife" title="For-Schleife">for-Schleife</a> auf mehrere Threads oder Prozessoren zu verteilen. Alternativ gibt es Bibliotheksfunktionen und Umgebungsvariablen für die OpenMP-Programmierung.
</p><p>OpenMP ist zum Einsatz auf Systemen mit gemeinsamem Hauptspeicher („Shared-Memory“-Maschinen) gedacht (sogenannte <a href="Unified_Memory_Access" class="mw-redirect" title="Unified Memory Access">UMA</a>- und <a href="Non-Uniform_Memory_Access" title="Non-Uniform Memory Access">NUMA</a>-Systeme), während andere Ansätze wie <a href="Message_Passing_Interface" title="Message Passing Interface">Message Passing Interface</a>, <a href="Parallele_Virtuelle_Maschine" title="Parallele Virtuelle Maschine">PVM</a> eher auf Multicomputern („Distributed-Memory“-Maschinen) aufsetzen. Bei modernen Supercomputern werden OpenMP und MPI (Message Passing Interface) oftmals zusammen eingesetzt. Dabei laufen auf einzelnen Shared-Memory-Clients OpenMP-Prozesse, die sich mittels MPI austauschen.
</p><p>Eine Eigenschaft von OpenMP ist, dass (bis auf Ausnahmen) die Programme auch korrekt laufen, wenn der Compiler die OpenMP-Anweisungen (siehe unten im Beispiel) nicht kennt und als Kommentar bewertet (also ignoriert). Der Grund dafür ist, dass eine mit OpenMP für mehrere Threads aufgeteilte <code>for</code>-Schleife auch mit einem einzelnen Thread sequentiell abgearbeitet werden kann.
</p>

<div class="mw-heading mw-heading2"><h2 id="Hauptbestandteile">Hauptbestandteile</h2></div>
<p>Die Hauptbestandteile von OpenMP sind Konstrukte zur Thread-Erzeugung, Lastverteilung auf mehrere <a href="Thread_(Informatik)" title="Thread (Informatik)">Threads</a>, Verwaltung des Gültigkeitsbereiches von Daten, Synchronisation, Laufzeitroutinen und Umgebungsvariablen. Die Thread-Erzeugung: <i>omp parallel</i> teilt das Programm (den Originalthread) in mehrere Threads auf, sodass der vom Konstrukt eingeschlossene Programmteil parallel abgearbeitet wird. Der Original-Thread wird als „Master Thread“ bezeichnet und trägt die ID&nbsp;„0“.
</p><p>Beispiel: Gibt „Hallo, Welt!“ mehrmals mittels mehrerer Threads aus (jeder Thread erzeugt eine Ausgabe).
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="cp">#pragma omp parallel</span>
<span class="w"> </span><span class="n">puts</span><span class="p">(</span><span class="s">"Hallo, Welt!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>

<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Die Konstrukte zur Lastverteilung bestimmen, wie nebenläufige, unabhängige Arbeitslast auf parallele Threads verteilt wird. <i>Omp for</i> und <i>omp do</i> teilen hierbei Schleifendurchläufe (möglichst) gleichmäßig auf alle Threads auf (Gebietsaufteilung, "data partitioning"). <i>Sections</i> verteilt aufeinander folgende, aber unabhängige Programmteile auf mehrere Threads (Funktionsaufteilung, "function partitioning") auf.
</p><p>Beispiel: Initialisiert eine große Tabelle ("array") parallel, wobei jeder Thread einen Teil initialisiert (Gebietsaufteilung).
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define N 100000</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>

<span class="cp">#pragma omp parallel for</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">N</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span>
<span class="w"> </span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>

<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Die Verwaltung eines Gültigkeitsbereich bei Daten lässt sich mit unterschiedlichen Programmierungen beeinflussen. Bei Shared-Memory-Programmierung sind zunächst die meisten Daten in allen Threads sichtbar. Einige Programme benötigen private, also nur für einen Thread sichtbare, Daten, und den expliziten Austausch von Werten zwischen sequentiellen und parallelen Abschnitten. Dafür dienen in OpenMP die sogenannten <i>Data Clauses</i>. Der Typ <i>shared</i> beschreibt, dass Daten für alle Threads sichtbar und änderbar sind. Sie liegen für alle Threads an derselben Speicherstelle. Ohne weitere Angaben sind Daten gemeinsame Daten. Die einzige Ausnahme davon sind Schleifenvariablen. Bei <i>private</i> verfügt jeder Thread über eigene Kopien dieser Daten, welche nicht initialisiert werden. Die Werte werden nicht außerhalb des parallelen Abschnitts bewahrt. Der Typ <i>private</i> lässt sich nochmal in <i>firstprivate</i> und <i>lastprivate</i> unterteilen, welche sich auch kombinieren lassen. Bei ersterem sind die Daten private Daten, mit dem Unterschied, dass sie mit dem letzten Wert vor dem parallelen Abschnitt initialisiert werden. <i>Lastprivate</i> unterscheidet sich darin, dass der Thread, welcher die letzte Iteration ausführt, anschließend den Wert aus dem parallelen Abschnitt herauskopiert.
</p><p>Außerdem gibt es noch den Typ <i>threadprivate</i> für globale Daten, die im parallelen Programmabschnitt jedoch als privat behandelt werden. Der globale Wert wird über den parallelen Abschnitt hinweg bewahrt. <i>Copyin</i> ist analog zu <i>firstprivate</i> für <i>private</i> Daten, allerdings für <i>threadprivate</i> Daten, welche nicht initialisiert werden. Mit <i>Copyin</i> wird der globale Wert explizit an die privaten Daten übertragen. Ein <i>Copyout</i> ist nicht notwendig, da der globale Wert bewahrt wird. Bei dem Typ <i>reduction</i> sind die Daten privat, werden jedoch am Ende auf einen globalen Wert zusammengefasst (reduziert). So lässt sich zum Beispiel die Summe aller Elemente eines <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Arrays</a> parallel bestimmen (Beispiel in <a href="Fortran" title="Fortran">Fortran</a>):
</p>
<div class="mw-highlight mw-highlight-lang-fortran mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="c">!$OMP DO REDUCTION(+:s)</span>
<span class="w"> </span><span class="k">do </span><span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">size</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">a</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="w"> </span><span class="k">end do</span>
</pre></div>
<p>Es werden verschiedene Konstrukte zur Synchronisation der Threads verwendet, wie z.&nbsp;B. <i>Critical Section</i>, wobei der eingeschlossene Programmabschnitt von allen Threads ausgeführt wird, allerdings niemals gleichzeitig oder <i>Barrier</i> welcher eine Barriere markiert, wo jeder Thread wartet, bis alle anderen Threads der Gruppe ebenfalls die Barriere erreicht haben. Der Befehl <i>atomic</i> ist analog zu <i>critical section</i>, jedoch mit dem Hinweis an den Compiler, spezielle Hardwarefunktionen zu benutzen. Der Compiler ist an diesen Hinweis nicht gebunden, er kann ihn ignorieren. Sinnvoll ist die Verwendung von <i>atomic</i> für das exklusive Aktualisieren von Daten. <i>Flush</i> markiert einen Synchronisationpunkt, an dem ein konsistentes Speicherabbild hergestellt werden muss. Private Daten werden in den Arbeitsspeicher zurückgeschrieben. <i>Single</i> bedeutet, dass der umschlossene Programmteil nur von dem Thread ausgeführt wird, welcher ihn zuerst erreicht, dies impliziert eine Barriere am Ende des Blocks und ist somit äquivalent mit <i>Barrier</i> an einer bestimmten Stelle. <i>Master</i> ist Analog zu <i>single</i> mit dem Unterschied, dass der umschlossene Programmteil vom Master Thread ausgeführt wird und am Ende des Blocks keine Barriere impliziert ist.
</p><p>Bei diesen Prozessen werden Laufzeitroutinen benutzt, um zum Beispiel die Thread-Anzahl während der Laufzeit zu bestimmen und zu ermitteln, ob sich das Programm gerade im parallelen oder sequentiellen Zustand befindet.
</p><p><a href="Umgebungsvariable" title="Umgebungsvariable">Umgebungsvariablen</a> liefern in diesem Zusammenhang, Informationen wie zum Beispiel die Thread-ID. Durch gezieltes Verändern bestimmter Umgebungsvariablen lässt sich die Ausführung von OpenMP-Programmen verändern. So kann beispielsweise die Anzahl von Threads und die Schleifenparallelisierung zur Laufzeit beeinflusst werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiel-Code">Beispiel-Code</h2></div>
<p>Der folgende Code veranschaulicht die parallele Ausführung einer for-Schleife mittels OpenMP. Je nach Anzahl der beteiligten Threads wird die Schleife in kleine Abschnitte unterteilt, die je einem Thread zugeordnet werden. Damit wird erreicht, dass alle Threads gleichzeitig rechnen.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;omp.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">omp_set_num_threads</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>

<span class="cp">#pragma omp parallel for</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">omp_get_thread_num</span><span class="p">();</span>

<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Hello World from thread %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">);</span>

<span class="w"> </span><span class="c1">// Nur im Master-Thread ausführen</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"There are %d threads</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">omp_get_num_threads</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Beim Übersetzen muss man dem Compiler sagen, dass er die Pragma-Anweisungen beachten und notwendige Bibliotheken für die omp-Funktionen einbinden soll. Dies funktioniert bei <code>gcc</code> oder <code>clang</code> über die Option <code>-fopenmp</code>.
</p>
<pre>% gcc -fopenmp example.c -o example
% ./example
Hello World from thread 3
Hello World from thread 0
Hello World from thread 1
Hello World from thread 2
There are 4 threads
</pre>
<p>Statt die Anzahl der Threads im Programm festzulegen, kann man dies auch zur Laufzeit bestimmen. Dazu setzt man die Umgebungsvariable <code>OMP_NUM_THREADS</code> auf den gewünschten Wert.
</p>
<pre>% OMP_NUM_THREADS=4 ./example
Hello World from thread 3
Hello World from thread 0
Hello World from thread 1
Hello World from thread 2
There are 4 threads
</pre>
<div class="mw-heading mw-heading2"><h2 id="Implementation">Implementation</h2></div>
<p>OpenMP ist in den meisten Compilern integriert.
</p>
<ul><li><a href="Microsoft_Visual_C%2B%2B" class="mw-redirect" title="Microsoft Visual C++">Microsoft Visual C++</a> 2005, 2008 und 2010 (Professional, Team System, Premium und Ultimate Edition),</li>
<li>Intel Parallel Studio für verschiedene Prozessoren (OpenMP 3.1 ab Version 13),</li>
<li><a href="GNU_Compiler_Collection" title="GNU Compiler Collection">GCC</a> ab Version 4.2 (OpenMP 4.0 ab Version 5.0<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>),</li>
<li><a href="Clang" title="Clang">Clang</a>/<a href="LLVM" title="LLVM">LLVM</a> (OpenMP 3.1 ab Version 3.6.1),</li>
<li>Oracle Solaris Studio Compiler und Tools für Solaris OS (UltraSPARC und x86/x64) und Linux,</li>
<li>Fortran, C und C++ Compiler der Portland Group (OpenMP 2.5),</li>
<li><a href="GNU_Fortran" title="GNU Fortran">Gfortran</a>,</li>
<li>IBM XL C/C++ compiler,</li>
<li>Nanos Compiler</li>
<li>Pelles C (OpenMP 3.1 ab Version 8)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.openmp.org/">Offizielle Website</a></li>
<li><a rel="nofollow" class="external text" href="http://www.llnl.gov/computing/tutorials/openMP/">Tutorial von OpenMP</a></li>
<li><style data-mw-deduplicate="TemplateStyles:r261891140">
/* start https://de.wikipedia.org/ */


.mw-parser-output .webarchiv-memento a{color:inherit}


/* end https://de.wikipedia.org/ */
</style><a rel="nofollow" class="external text" href="https://web.archive.org/web/20111111165214/http://www.bero-software.de/tutorials_programming/omp.pdf">OpenMP-Programmiergrundlagen</a> (<span class="webarchiv-memento"><a href="Webarchivierung#Begrifflichkeiten" title="Webarchivierung">Memento</a></span> vom 11. November 2011 im <i><a href="Internet_Archive" title="Internet Archive">Internet Archive</a></i>) (PDF; 80&nbsp;kB) C-orientiert (deutsch)</li>
<li><a rel="nofollow" class="external text" href="http://www.intel.com/content/www/us/en/education/university/intel-many-core-curriculum-list/openmp-videos.html">Einführungsvideos</a> von Intel</li>
<li><a rel="nofollow" class="external text" href="http://myarm.de/blog-parallelit%C3%A4t-messen-und-visualisieren.html">OpenMP Parallelität messen und visualisieren</a> anhand eines C++ Routenplaners wird der <a href="Speedup" title="Speedup">Speedup</a>-Faktor ermittelt (von MyARM)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/gcc-5/changes.html">gcc.gnu.org</a></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-10-16" href="https://de.wikipedia.org/wiki/?title=OpenMP&amp;oldid=260644881">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>